// 鼠标跟随的生成艺术 - 基于原始压缩代码的Processing版本
// 原始代码: a=(y,d=mag(k=(y<11?6+sin(y^8)*6:y/5+cos(y/2))*cos(i-t/4),e=y/7-13)+sin(e/4+t)/2)=>point((q=y*k/d*(3+sin(d*2+y/2-t*4)))+60*cos(c=d/2+1-t/2)+200,q*sin(c)+d*29-170)
// t=0,draw=$=>{t||createCanvas(w=400,w);background(9).stroke(w,96);for(t+=PI/120,i=1e4;i--;)a(i/345)}

float t = 0;
float w = 400;

// 鼠标位置变量
float mouseTargetX = 200;
float mouseTargetY = 200;
float currentMouseX = 200;
float currentMouseY = 200;

void setup() {
  size(800, 600);
  background(9);
  stroke(255, 96);
  strokeWeight(1);
  noFill();
  
  // 初始化鼠标位置到画布中心
  mouseTargetX = width / 2;
  mouseTargetY = height / 2;
  currentMouseX = mouseTargetX;
  currentMouseY = mouseTargetY;
}

void draw() {
  // 半透明背景实现拖尾效果
  fill(9, 10);
  noStroke();
  rect(0, 0, width, height);
  
  stroke(255, 96);
  strokeWeight(1);
  
  // 平滑鼠标跟随
  currentMouseX = lerp(currentMouseX, mouseTargetX, 0.1);
  currentMouseY = lerp(currentMouseY, mouseTargetY, 0.1);
  
  // 更新时间
  t += PI / 120;
  
  // 绘制生成艺术图案
  for (int i = 0; i < 10000; i++) {
    drawArtPoint(i / 345.0);
  }
  
  // 显示说明文本
  drawInstructions();
}

// 原始函数的Processing版本，添加鼠标跟随
void drawArtPoint(float y) {
  // 计算k值
  float k;
  if (y < 11) {
    k = (6 + sin(pow(y, 8)) * 6) * cos(t - t/4);
  } else {
    k = (y/5 + cos(y/2)) * cos(t - t/4);
  }
  
  // 计算e值
  float e = y/7 - 13;
  
  // 计算d值 (距离)
  float d = mag(k, e) + sin(e/4 + t)/2;
  
  // 计算c值
  float c = d/2 + 1 - t/2;
  
  // 计算q值
  float q = y * k / d * (3 + sin(d*2 + y/2 - t*4));
  
  // 计算点的位置 - 使用鼠标位置作为中心
  float x = q + 60 * cos(c) + currentMouseX;
  float yPos = q * sin(c) + d * 29 - 170 + currentMouseY;
  
  // 绘制点
  point(x, yPos);
}

// 鼠标移动事件
void mouseMoved() {
  mouseTargetX = mouseX;
  mouseTargetY = mouseY;
}

// 鼠标拖拽事件
void mouseDragged() {
  mouseTargetX = mouseX;
  mouseTargetY = mouseY;
}

// 添加键盘控制
void keyPressed() {
  if (key == 'r' || key == 'R') {
    // 重置画布
    background(9);
  } else if (key == 'c' || key == 'C') {
    // 清除画布
    background(9);
    t = 0;
  } else if (key == 's' || key == 'S') {
    // 保存图片
    save("mouse_following_art_" + frameCount + ".png");
  }
}

// 添加说明文本
void drawInstructions() {
  fill(255, 100);
  noStroke();
  textAlign(LEFT);
  text("移动鼠标来控制图案中心", 10, height - 40);
  text("按 R 重置画布 | C 清除并重置 | S 保存图片", 10, height - 20);
}